import { WebSocketMessage } from '@/types/webSocket'
import { ElMessage } from 'element-plus'
import { dataFormat } from './dataFormatting'
import { messageDB } from './database'

/**
 * 处理WebSocket消息的回调函数类型定义
 */
interface MessageCallbacks {
  onFriendRequestUpdate?: () => void
  // 可以再新增其他回调
}

/**
 * 处理WebSocket消息
 * @param msg WebSocket消息对象
 * @param callbacks 可选的回调函数对象
 */
export async function handleMessage(
  msg: WebSocketMessage,
  callbacks?: MessageCallbacks
): Promise<void> {
  console.log('handleMessage -> 处理消息:', dataFormat(msg))
  if (msg.type === 'error') {
    ElMessage.error(msg.content)
  } else if (msg.type === 'FRIEND_REQUEST_SUCCESS') {
    ElMessage.success(msg.content)
  } else if (msg.type === 'NEW_FRIEND_REQUEST') {
    // 新好友申请时，将好友申请添加到本地保存
    const friendRequest = {
      id: msg.data.id,
      fromUserId: msg.data.fromUserId,
      toUserId: msg.data.toUserId,
      status: msg.data.status,
      note: msg.data.note,
      fromUserNickname: msg.data.fromUserNickname,
      toUserNickname: msg.data.toUserNickname,
      fromUserAvatar: msg.data.fromUserAvatar,
      toUserAvatar: msg.data.toUserAvatar,
      createTime: msg.data.createTime
    }
    await messageDB?.addFriendRequest(friendRequest)

    // 如果提供了回调函数，通知主组件好友申请数量更新
    if (callbacks?.onFriendRequestUpdate) {
      callbacks.onFriendRequestUpdate()
    }
  } else if (msg.type === 'OFFLINE_MESSAGE') {
    // 离线消息时，判断离线消息类型
    const type = msg.data.type
    switch (type) {
      case 'NEW_FRIEND_REQUEST':
        // 新好友申请时，将好友申请添加到本地保存
        const friendRequest = {
          id: msg.data.friendId,
          fromUserId: msg.data.fromUserId,
          toUserId: msg.data.toUserId,
          status: msg.data.requestStatus,
          note: msg.data.note,
          fromUserNickname: msg.data.fromUserNickname,
          toUserNickname: msg.data.toUserNickname,
          fromUserAvatar: msg.data.fromUserAvatar,
          toUserAvatar: msg.data.toUserAvatar,
          createTime: msg.data.sendTime
        }
        await messageDB?.addFriendRequest(friendRequest)
        // 如果提供了回调函数，通知主组件好友申请数量更新
        if (callbacks?.onFriendRequestUpdate) {
          callbacks.onFriendRequestUpdate()
        }
        break
      default:
        // 未知消息类型
        break
    }
  }
}
